package com.liyuci.core.thymeleaf.eleondialect;

import static java.util.Collections.unmodifiableList;
import static org.thymeleaf.util.StringUtils.trim;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.engine.AttributeName;
import org.thymeleaf.exceptions.TemplateProcessingException;
import org.thymeleaf.model.IProcessableElementTag;
import org.thymeleaf.standard.expression.IStandardExpression;
import org.thymeleaf.standard.expression.IStandardExpressionParser;
import org.thymeleaf.standard.expression.StandardExpressionParser;
import org.thymeleaf.util.EvaluationUtils;
import org.thymeleaf.util.StringUtils;  

/**
 * thymeleaf解析器
 * @author liyuci
 * @date 2018-02-06 00:16:02
 */
public class ThymeleafFacade
{
	/**
	 * 不允许实例化
	 */
	private ThymeleafFacade()
	{
		throw new UnsupportedOperationException();
	}

	/**
	 * 获取标签属性的原始值（有可能是一个表达式）
	 * @author liyuci
	 * @date 2018-02-06 00:29:13
	 * @param tag
	 * @param attributeName
	 * @return
	 */
	public static String getRawValue(final IProcessableElementTag tag, final AttributeName attributeName)
	{
		final String rawValue = trim(tag.getAttributeValue(attributeName));
		return rawValue;
	}

	/**
	 * 获取标签属性的原始值（有可能是一个表达式）
	 * @author liyuci
	 * @date 2018-02-06 00:30:12
	 * @param tag
	 * @param attributeName
	 * @return
	 */
	public static String getRawValue(final IProcessableElementTag tag, final String attributeName)
	{
		final String rawValue = trim(tag.getAttributeValue(attributeName));
		return rawValue;
	}

	/**
	 * 根据原始值获取真实的值，如果原始值不是表达式就直接返回，如果是表达式就进行解析返回真实值
	 * @author liyuci
	 * @date 2018-02-06 00:30:19
	 * @param context
	 * @param expression
	 * @return
	 */
	public static Object evaluateRawValue(ITemplateContext context, String rawValue)
	{
		final IStandardExpressionParser parser = new StandardExpressionParser();
		final IStandardExpression evaluableExpression = parser.parseExpression(context, rawValue);
		return evaluableExpression.execute(context);
	}

	/**
	 * 根据原始值的表达式返回列表信息
	 * @author liyuci
	 * @date 2018-02-06 00:33:30
	 * @param context
	 * @param rawValue
	 * @return
	 * @throws TemplateProcessingException
	 */
	@SuppressWarnings("rawtypes")
	public static List evaluateAsList(ITemplateContext context, String rawValue)
	{
		final Object evaluatedExpression = evaluateRawValue(context, rawValue);
		return EvaluationUtils.evaluateAsList(evaluatedExpression);
	}
	
	/**
	 * 根据原始值获取数据信息
	 * @author liyuci
	 * @date 2018-02-06 00:38:43
	 * @param context
	 * @param rawValue
	 * @return
	 */
	public static BigDecimal evaluateAsNumber(ITemplateContext context, String rawValue)
	{
		final Object evaluateRawValue = evaluateRawValue(context, rawValue);
		return EvaluationUtils.evaluateAsNumber(evaluateRawValue);
	}

	@SuppressWarnings("unchecked")
	private static List<Object> evaluateAsListOrRawValue(ITemplateContext context, String rawValue)
	{
		final List<Object> result = new ArrayList<Object>();
		try
		{
			result.addAll(evaluateAsList(context, rawValue));
		}
		catch(TemplateProcessingException ex)
		{
			result.add(rawValue);
		}
		return unmodifiableList(result);
	}
	
	/**
	 * 根据格式化（以“delimiter”作为分隔符）真实值字符串转List集合
	 * @author liyuci
	 * @date 2018-02-06 00:57:47
	 * @param context
	 * @param rawValue		标签的属性名称
	 * @param delimiter			分隔符
	 * @return
	 */
	public static List<String> evaluateAsListStringWithDelimiter(ITemplateContext context, String rawValue, String delimiter)
	{
		final List<String> result = new ArrayList<String>();
		final List<Object> iterates = evaluateAsListOrRawValue(context, rawValue);
		for(Object o : iterates)
		{
			String[] arr = StringUtils.split(o, delimiter);
			for(String value : arr)
			{
				result.add(value.trim());
			}
		}
		return unmodifiableList(result);
	}
}
